package com.zmcn.flowindex.fw.tool.bean;

import java.util.ArrayList;
import java.util.List;

import com.zmcn.flowindex.fw.util.FileOP;

/**
 * 解析PowerDesign数据库脚本
 * 
 * @author 欧建东
 * @email oyjd@163.com
 * 
 */
public class DbScriptOracleParse {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String path = "D:\\crebas.sql";
		List<TableVO> list = parse(path, "GBK");
		for(TableVO vo:list){
			System.out.println(vo.getTable());
			for(ColVO v:vo.getCols()){
				System.out.println("    "+v);
			}
			System.out.println("--------------------------------------------------------------------------------------------");
		}
	}

	/**
	 * 解析
	 * 
	 * @param path
	 * @param encoding
	 * @return
	 */
	public static List<TableVO> parse(String path, String encoding) {
		List<TableVO> list = new ArrayList<TableVO>();
		String c = FileOP.readFile(path, encoding);
		int p;
		TableVO tmp = null;
		while ((p = c.indexOf(";")) != -1) {
			String aim = c.substring(0, p).trim();
			int p1;
			if ((p1 = aim.lastIndexOf("*/")) != -1) {
				aim = aim.substring(p1 + 2).trim();
			}
			// 处理目标字符串
			if (aim.startsWith("CREATE TABLE")) {
				tmp = parseOneTable(aim);
				list.add(tmp);
			} else if (null != tmp && aim.startsWith("COMMENT")) {
				parseOneTableNote(tmp, aim);
			}
			//
			c = c.substring(p + 1);
		}
		return list;
	}

	/**
	 * 解析一个table：表名、字段名对应的注释
	 * 
	 * 
	 * @param s
	 */
	private static void parseOneTableNote(TableVO vo, String aim) {
		String note = aim.substring(aim.indexOf("'") + 1, aim.lastIndexOf("'"));
		if (aim.startsWith("COMMENT ON TABLE")) {
			vo.getTable().setDesc(note);
		} else if (aim.startsWith("COMMENT ON COLUMN")) {
			String col = aim.substring(aim.indexOf(".") + 1, aim.lastIndexOf("IS")).trim();
			for (ColVO v : vo.getCols()) {
				if (v.getName().equals(col)) {
					v.setDesc(note);
					break;
				}
			}
		}
	}

	/**
	 * 解析一个table：表名、字段名
	 * 
	 * 
	 * @param s
	 */
	private static TableVO parseOneTable(String s) {
		TableVO vo = new TableVO();
		int p = s.indexOf("(");
		int q = s.lastIndexOf(")");
		String a = s.substring(0, p).trim();
		a = a.replace("CREATE", "").replace("TABLE", "").trim();
		vo.getTable().setName(a);
		String b = s.substring(p + 1, q).trim();
		String[] bs = b.split(",");
		for (String ss : bs) {
			if (ss.indexOf("CONSTRAINT") == -1) {
				vo.getCols().add(parseCol(ss.trim()));
			}
		}
		return vo;
	}

	/**
	 * 解析一行
	 * 
	 * @param s
	 * @return
	 */
	private static ColVO parseCol(String s) {
		ColVO vo = new ColVO();
		String[] ss = s.split(" ");
		int p = 0;
		for (String t : ss) {

			if (!"".equals(t)) {
				p++;
				if (1 == p) {
					vo.setName(t.replaceAll("\"", ""));
				} else if (2 == p) {
					if (-1 != t.indexOf("CHAR")) {
						vo.setType("String");
						String tlen = t.substring(t.indexOf("(") + 1, t.indexOf(")"));
						vo.setLen(Integer.parseInt(tlen));
					} else if (-1 != t.indexOf("DATE")) {
						vo.setType("Date");
					} else if (-1 != t.indexOf("INT")) {
						vo.setType("int");
					} else if (-1 != t.indexOf("FLOAT")) {
						vo.setType("float");
					}else if (-1 != t.indexOf("NUMBER")) {
						vo.setType("long");
					}else if (-1 != t.indexOf("LONG")) {
						vo.setType("long");
					}
				} else if (3 == p) {
					vo.setPk(true);
				}

			}
		}
		return vo;
	}

}
